package com.tanhua.admin.controller;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.tanhua.admin.service.AdminService;
import com.tanhua.commons.utils.Constants;
import com.tanhua.model.vo.AdminVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/system/users")
public class SystemController {

    @Autowired
    private AdminService adminService;

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    /**
     * 生成图片验证码
     *  GET  /verification
     *  参数：
     *      Query参数：uuid
     *  响应：
     *      以图片流（response的输出流）的形式响应图片信息
     */
    @GetMapping("/verification")
    public void verification(String uuid, HttpServletResponse response) throws IOException {
        //1、使用工具类生成一个验证码对象 （包含了图片数据流，包含了验证码信息）
        LineCaptcha captcha = CaptchaUtil.createLineCaptcha(299, 97);//指定验证码宽和高
        //2、获取验证码内容
        String code = captcha.getCode();
        //3、将验证码存入到redis中
        String key = Constants.CAP_CODE+uuid;
        redisTemplate.opsForValue().set(key,code,3, TimeUnit.MINUTES);
        //4、将图片输出 :response的输出流
        captcha.write(response.getOutputStream());
    }


    /**
     * 管理员登录：
     *    POST   /login
     *    参数：Body
     *      username，password，verificationCode，uuid
     *     返回值：
     *      token
     */
    @PostMapping("/login")
    public ResponseEntity login(@RequestBody Map map) {
        //1、获取参数
        String username = (String) map.get("username");
        String password = (String) map.get("password");
        String code = (String) map.get("verificationCode");
        String uuid = (String) map.get("uuid");
        //2、调用service
        String token = adminService.login(username,password,code,uuid);
        Map retMap = new HashMap();
        retMap.put("token",token);
        //3、返回
        return ResponseEntity.ok(retMap);
    }


    /**
     * 登出 退出
     */
    @PostMapping("/logout")
    public Map logout(@RequestHeader("Authorization") String token)  {
        return adminService.logout( token.replace("Bearer ","") );
    }
    /**
     * 获取管理员信息
     * 请求时，会携带token == 在自定义的拦截器中解析并存放到了AdminHolder
     *      POST    /profile
     *      返回值：
     *          AdminVo
     */
    @PostMapping("/profile")
    public ResponseEntity profile() {
        System.out.println(123);
        //1、调用service查询当前用户
        AdminVo vo = adminService.profile();
        //2、返回
        return ResponseEntity.ok(vo);
    }
}
